//#include "muduo/net/EventLoop.h"
//#include "muduo/net/TcpClient.h"
//#include "muduo/net/EventLoopThread.h"
//#include "muduo/base/CountDownLatch.h"
//#include <iostream>
//#include <functional>
//#include <unordered_map>
//#include <mutex>  // 添加互斥锁头文件
//
//class DictClient
//{
//public:
//  DictClient(const std::string ip, int port) : _latch(1), 
//      _client(_loopthread.startLoop(), muduo::net::InetAddress(ip, port), "DictClient")
//  {
//    _client.setConnectionCallback(std::bind(&DictClient::onConnection, this, std::placeholders::_1));
//    _client.setMessageCallback(std::bind(&DictClient::onMessage, this, std::placeholders::_1,
//          std::placeholders::_2, std::placeholders::_3));
//  }
//  ~DictClient(){}
//  
//  void connect(){
//    _client.connect();
//    _latch.wait(); // 阻塞等待连接
//  }
//  
//  void send(std::string& buf){
//    std::lock_guard<std::mutex> lock(_mutex); // 加锁保护
//    if(_conn && _conn->connected()) {
//      _conn->send(buf);
//    } else {
//      std::cerr << "连接未建立或已断开，无法发送消息" << std::endl;
//    }
//  }
//  
//private:
//  void onConnection(const muduo::net::TcpConnectionPtr &conn) 
//  {
//    std::lock_guard<std::mutex> lock(_mutex); // 加锁保护
//    if(conn->connected())
//    {
//      std::cout << "连接成功" << std::endl;
//      _conn = conn;
//    }
//    else
//    {
//      std::cout << "连接关闭" << std::endl;
//      _conn.reset();
//    }
//    _latch.countDown(); // 无论成功失败都解除阻塞
//  }
//  
//  void onMessage(const muduo::net::TcpConnectionPtr &conn, 
//                 muduo::net::Buffer *buf, 
//                 muduo::Timestamp t)
//  {
//    std::cout << "翻译结果：" << buf->retrieveAllAsString() << std::endl;
//  }
//
//private:
//  muduo::net::EventLoopThread _loopthread;
//  muduo::net::TcpClient _client;
//  muduo::CountDownLatch _latch;
//  muduo::net::TcpConnectionPtr _conn;
//  std::mutex _mutex; // 添加互斥锁
//};
//
//int main()
//{
//  DictClient client("127.0.0.1", 8080);
//  client.connect();
//
//  while(true)
//  {
//    std::string str;
//    std::getline(std::cin, str); // 使用getline读取整行
//    if (!str.empty()) {
//      client.send(str);
//    }
//  }
//  return 0;
//}
#include "muduo/net/EventLoopThread.h" 
#include "muduo/base/CountDownLatch.h"
#include "muduo/net/TcpClient.h"
#include "muduo/net/TcpConnection.h" 
#include <iostream> 
#include <functional> 
#include <unordered_map> 
#include<mutex>

class DictClient
{
public:
  DictClient(const std::string ip,int port):_latch(1),_client(_loopthread.startLoop(),muduo::net::InetAddress(ip,port),"DictClient")
  {
    _client.setConnectionCallback(std::bind(&DictClient::onConnection,this,std::placeholders::_1));
    _client.setMessageCallback(std::bind(&DictClient::onMessage,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
  }
  ~DictClient(){}
  //正常调用完就会返回，我们不知道连接建立成功没，所以需要通过_latch来进行阻塞等待连接
  void connect(){
    _client.connect();
    _latch.wait();//阻塞等待连接
  }
  bool send(const std::string& buf){
    if(_conn->connected())
    {
      _conn->send(buf);
      return true;
    }
    return false;
  }

private:
  //连接建立成功时会调用的回调函数，这时需要取消阻塞状态
  void onConnection(const muduo::net::TcpConnectionPtr &conn) 
  {
    if(conn->connected())
    {
      _conn=conn;
      _latch.countDown();
      std::cout<<"连接成功"<<std::endl;
    }
    else
    {
      _conn.reset();
      std::cout<<"连接关闭"<<std::endl;
    }
  }
  void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp t)
  {
    std::cout<<"翻译结果："<<buf->retrieveAllAsString()<<std::endl;
  }

private:
  muduo::CountDownLatch _latch;
  muduo::net::EventLoopThread _loopthread;
  muduo::net::TcpClient _client;
  muduo::net::TcpConnectionPtr _conn;
  std::mutex _mutex;
};


int main()
{
  DictClient client("127.0.0.1",8080);
  client.connect();

  while(true)
  {
    std::string str;
    std::cout<<"plesse enter#";
    std::getline(std::cin,str);
    client.send(str);
  }
  return 0;
}
